// 提供一些常用 utility 方法

/**
 * 将参数转为 queryString 添加到 url 中
 * @param {*} url
 * @param {*} params
 * @returns
 */
export function urlQuery(url, params) {
  if (!params) {
    return url;
  }
  let qstr = params2Query(params);
  if (qstr) {
    if (url.indexOf("?") !== -1) {
      return url + "&" + qstr;
    } else {
      return url + "?" + qstr;
    }
  } else {
    return url;
  }
}

/**
 * 参数转换为 queryString 格式
 * @param {*} params
 * @returns
 */
export function params2Query(params = {}) {
  var qstr = Object.keys(params)
    .map((key) => {
      return encodeURIComponent(key) + "=" + encodeURIComponent(params[key]);
    })
    .join("&");
  return qstr;
}

/**
 * 填充默认内容
 *
 * stringTemplate("hello ${name}", {name: "pw"}) // "hello pw"
 *
 * @param {*} tmpl
 * @param {*} context
 * @returns
 */
export function stringTemplate(tmpl, context) {
  return tmpl.replace(/\${(.*?)}/g, (match, key) => context[key.trim()]);
}

/**
 * 获取当前浏览器环境信息
 * @returns
 */
export function browserEnv() {
  if (!window) {
    return {};
  }
  var u = window.navigator.userAgent;
  var ua = window.navigator.userAgent.toLocaleLowerCase();
  let _reg_mobile = /iphone|android|symbianos|windows\sphone/g;
  let isMobile = _reg_mobile.test(ua);
  return {
    // mobile: !!u.match(/AppleWebKit.*Mobile.*/) || !!u.match(/AppleWebKit/), // 是否为移动终端
    mobile: isMobile, // 是否为移动终端
    pc: !isMobile, // 是否为桌面pc
    trident: u.indexOf("Trident") > -1, // IE内核
    presto: u.indexOf("Presto") > -1, // opera内核
    webKit: u.indexOf("AppleWebKit") > -1, //苹果、谷歌内核
    gecko: u.indexOf("Gecko") > -1 && u.indexOf("KHTML") == -1, // 火狐内核
    ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), // IOS终端
    android: u.indexOf("Android") > -1 || u.indexOf("Mac") > -1, // 安卓终端
    iPhone: u.indexOf("iPhone") > -1 || u.indexOf("Mac") > -1, // 是否为iphone或QQHD浏览器
    iPad: u.indexOf("iPad") > -1, // 是否为iPad
    webApp: u.indexOf("Safari") == -1, // 是否web应用程序，没有头部与底部
    qqbrw: u.indexOf("MQQBrowser") > -1, // QQ浏览器
    qq: ua.match(/QQ/i) == "qq", // QQ
    tim: u.indexOf("MQQBrowser") > -1 && u.indexOf("TIM") > -1, // QQ的TIM
    alipay: u.indexOf("Alipay") > -1, // 支付宝
    dingding: u.indexOf("DingTalk") > -1, // 钉钉
    weixin: u.indexOf("MicroMessenger") > -1, // 微信
    weixinWork:
      u.indexOf("MicroMessenger") > -1 && ua.match(/wxwork/i) == "wxwork", // 微信
    weibo: ua.match(/WeiBo/i) == "weibo", // 微博
    ucLowEnd: u.indexOf("UCWEB7.") > -1, //
    ucSpecial: u.indexOf("rv:1.2.3.4") > -1,
    webview:
      !(u.match(/Chrome\/([\d.]+)/) || u.match(/CriOS\/([\d.]+)/)) &&
      u.match(/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/),
    ucweb: (function () {
      try {
        return (
          parseFloat(
            u
              .match(/ucweb\d+\.\d+/gi)
              .toString()
              .match(/\d+\.\d+/)
              .toString()
          ) >= 8.2
        );
      } catch (e) {
        if (u.indexOf("UC") > -1) {
          return true;
        }
        return false;
      }
    })(),
    Symbian: u.indexOf("Symbian") > -1,
    ucSB: u.indexOf("Firofox/1.") > -1,
  };
}

/**
 * timeout的promise版本
 * @param {*} t
 * @returns
 */
export function timeout(t) {
  return new Promise((resolve) => {
    setTimeout(() => resolve(), t);
  });
}

/**
 * 是否为闰年
 *
 * @param {*} year
 * @returns
 */
export function isLeapYear(year) {
  // 如果year年2月没有29则自动进一变为3月1日
  let date = new Date(year, 1, 29);
  return date.getDate() === 29;
}

/**
 * 获取指定月份的天数
 *
 * @param {*} year
 * @param {*} month
 * @returns
 */
export function monthDayNumber(year, month) {
  var date = new Date(year, month + 1, 1, 0, 0, 0);
  var yesterDay = new Date(date - 1000);
  return yesterDay.getDate();
}

/**
 * 获取指定年份的日期选择
 *
 * @param {*} start
 * @param {*} end
 * @returns
 */
export function pickerDateOptions(start = 0, end = 3) {
  let yearList = pickerYearOptions(start, end);
  yearList.forEach((y) => {
    let monthList = pickerMonthOptions();
    monthList.forEach((m) => {
      let dayList = pickerDayOptions(y.value, m.value);
      m.children = dayList;
    });
    y.children = monthList;
  });
  return yearList;
}

/**
 * 获取年份列表
 *
 * @param {*} start
 * @param {*} end
 * @param {*} suffix
 * @returns
 */
export function pickerYearOptions(start = 0, end = 3, suffix) {
  let today = new Date();
  let year = today.getFullYear();
  let options = [];
  // 年份，可以传入开始域结尾年份
  start = year - start;
  end = year + end;
  for (let i = 0; i < end - start; i++) {
    let currYear = start + i;
    let currYearLabel = suffix ? currYear + suffix : "" + currYear;
    options.push({
      label: currYearLabel,
      value: currYear,
    });
  }
  return options;
}

/**
 * 获取 picker 使用的月份列表
 *
 * @param {*} suffix
 * @returns
 */
export function pickerMonthOptions(suffix) {
  let options = [];
  for (let i = 1; i <= 12; i++) {
    let currMonth = suffix ? i + suffix : "" + (i < 10 ? "0" + i : i);
    options.push({
      label: currMonth,
      value: i - 1,
    });
  }
  return options;
}

/**
 * 获取 picker 使用的日期列表
 *
 * @param {*} year
 * @param {*} month
 * @param {*} suffix
 */
export function pickerDayOptions(year, month, suffix) {
  let options = [];
  let dNumber = monthDayNumber(year, month);
  for (let i = 1; i <= dNumber; i++) {
    let currDay = suffix ? i + suffix : "" + (i < 10 ? "0" + i : i);
    options.push({
      label: currDay,
      value: i,
    });
  }
  return options;
}

/**
 *
 * @returns
 */
export function pickerHourOptions(suffix) {
  let options = [];
  for (let i = 0; i < 24; i++) {
    let currHour = suffix ? i + suffix : "" + (i < 10 ? "0" + i : i);
    options.push({
      label: currHour,
      value: i,
    });
  }
  return options;
}

export function pickerMinuteOptions(suffix) {
  let options = [];
  for (let i = 0; i < 60; i++) {
    let currMinute = suffix ? i + suffix : "" + (i < 10 ? "0" + i : i);
    options.push({
      label: currMinute,
      value: i,
    });
  }
  return options;
}

export function pickerSecondOptions(suffix) {
  let options = [];
  for (let i = 0; i < 60; i++) {
    let currSecond = suffix ? i + suffix : "" + (i < 10 ? "0" + i : i);
    options.push({
      label: currSecond,
      value: i,
    });
  }
  return options;
}

//格式化日期：yyyy-MM-dd
export function formatDate(date = new Date(), split = "-") {
  let y = date.getFullYear();
  let m = date.getMonth() + 1;
  let d = date.getDate();

  if (m < 10) {
    m = "0" + m;
  }
  if (d < 10) {
    d = "0" + d;
  }
  return y + split + m + split + d;
}

/**
 * 小数保留为 n 位
 * @param {*} val
 * @param {*} num
 * @returns
 */
export function numToFixed(val = 0, num = 2) {
  val = Number(val);
  val = isNaN(val) ? 0 : val;
  return val.toFixed(num);
}
